﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DDD.Core {

    /// <summary>
    /// コリジョン形状をあらわす構造体
    /// </summary>
    /// <remarks>
    /// <see cref="CollisionShape"/> はコリジョン検出で使用される形状をあらわします。
    /// コリジョン検出の詳細については、<see cref="CollisionVolume"/> コンポーネントの解説を参照してください。
    /// コリジョン形状の追加は、<see cref="CollisionVolume.SetCollisionShape()"/> メソッドで行います。
    /// <para>
    /// <h3>k-DOP</h3>
    /// DDDではコリジョン形状をk=13のk-DOP(v=26)であらわします。
    /// 解説省略。
    /// <note type="implement">
    /// 後で書く
    /// </note>
    /// </para>
    /// アニメート可能、エクスポート可能。
    /// </remarks>
    public struct CollisionShape : IExportable<float>, IAnimatable<float> {
        /// <summary>
        /// コンストラクター
        /// </summary>
        /// <remarks>
        /// <paramref name="min"/>, <paramref name="max"/> はただちに内部に確保した領域にコピーされます。
        /// </remarks>
        /// <param name="orientation">13軸のうち(v=26)の使用する主軸のビットを立てたもの</param>
        /// <param name="min">領域を形成する軸の下限値</param>
        /// <param name="max">領域を形成する軸の上限値</param>
        public CollisionShape (int orientation, float[] min, float[] max)
            : this () {
            this.Orientaion = orientation;
            this.Min = (float[])min.Clone ();
            this.Max = (float[])max.Clone ();
        }

        /// <summary>
        /// 有効無効フラグ
        /// </summary>
        /// <remarks>
        /// このコリジョン形状が有効ならtrue, そうでなければfalseを返します。
        /// <note type="implement">
        /// このプロパティをなぜ定義したか忘れた。
        /// 今は常に <c>true</c> を返す。
        /// 必要ないはずなので消せ。
        /// </note>
        /// </remarks>
        public bool IsValid {
            get { return true; }
        }

        /// <summary>
        /// 有効軸（？）
        /// </summary>
        /// <remarks>
        /// 13軸(v=26)のうち使用する軸にビットを立てたもの
        /// <note type="implement">
        /// 日本語不明。一般的には何というの？
        /// </note>
        /// </remarks>
        public int Orientaion { get; private set; }

        /// <summary>
        /// 領域を形成する軸の下限値
        /// </summary>
        /// <remarks>
        /// 必ず長さ13の配列で返ります。
        /// </remarks>
        public float[] Min { get; private set; }

        /// <summary>
        /// 領域を形成する軸の上限値
        /// </summary>
        /// <remarks>
        /// 必ず長さ13の配列で返ります。
        /// </remarks>
        public float[] Max { get; private set; }


        /// <inheritdoc/>
        public int ComponentCount {
            get { return 0; }
        }

        /// <inheritdoc/>
        public float this[int index] {
            get { return 0; }
            set { }
        }

        /// <inheritdoc/>
        public override string ToString () {
            return string.Format("CollisionShape: Orientation={0}, Min={1}, Max={2}", Orientaion, Min, Max);
        }
    }
}
